// 1.1 c++继承- 基类&派生类

/**
 * 面向对象的编程语言有封装、继承 、抽象、多态等4个主要的特征
 * 
 * c++继承
 * 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类，这使得创建和维护一个应用程序变得更容易。这样做，也达到了重用代码功能和提高执行效率的效果。
 * 
 * 当创建一个类时，您不需要重新编写新的数据成员和成员函数，只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类，新建的类称为派生类。
 * 
 * 继承代表了 is a 关系。例如，哺乳动物是动物，狗是哺乳动物，因此，狗是动物，等等。
                                animal
                                 eat()
           基类--------->        sleep()
 
                                  Dog
           派生类-------->        bark()
 
 * 代码如下:
      //  基类
      class animal{
        // eat() 函数
        // sleep() 函数
      }

      // 派生类
      class Dog : public Animal{
        // bark() 函数
      }
 * 
 * ------------------------------
 * 基类&派生类
 * 一个类可以派生自多个类，这意味着，它可以从多个基类继承数据和函数。定义一个派生类，我们使用一个类派生列表来指定基类。类派生列表以**一个或多个**基类命名，形式如下：

    class derived-class: access-specifier base-class

 * 其中，访问修饰符 access-specifier 是 public、protected 或 private 其中的一个，base-class 是之前定义过的某个类的名称。如果未使用访问修饰符 access-specifier，则默认为 private。
 * 假设有一个基类 Shape，Rectangle 是它的派生类，如下所示：（示例一）
 *
*/

#include <iostream>

/**
 * 示例一
*/
class Shape
{
public:
  void setWidth(int);
  void setHeight(int);

protected:
  int width;
  int height;
};

void Shape::setWidth(int w)
{
  width = w;
}
void Shape::setHeight(int h)
{
  height = h;
}

class Item
{
public:
  void test();
};

void Item::test()
{
  std::cout << "it is a item" << std::endl;
}

// class Rectangle : public Shape
class Rectangle : public Shape,public Item
{
public:
  int getArea()
  {
    return width * height;
  }
};
int main(void)
{
  Rectangle r1;
  r1.setWidth(10);
  r1.setHeight(5);
  std::cout << "r1 area : " << r1.getArea() << std::endl;
  r1.test();
  printf("-----------------end-----------------\n");
  // system("pause");
  return 0;
}